package com.seal.ui.views;

import android.content.Context;
import android.util.AttributeSet;
import android.view.animation.OvershootInterpolator;
import android.widget.LinearLayout;
import android.widget.Scroller;

public class OverScrollWarpLayout extends LinearLayout {

	/**
	 * OvershootInterpolator的弹性系数
	 */
	private static final float OVERSHOOT_TENSION = 0.75f;

	/**
	 * 平滑滚动器
	 */
	private Scroller mScroller;

	public OverScrollWarpLayout(Context context, AttributeSet attr) {
		super(context, attr);
		this.setOrientation(LinearLayout.VERTICAL);
		// 初始化平滑滚动器
		mScroller = new Scroller(getContext(), new OvershootInterpolator(OVERSHOOT_TENSION));
	}

	public OverScrollWarpLayout(Context context) {
		super(context);
		this.setOrientation(LinearLayout.VERTICAL);
		// 初始化平滑滚动器
		mScroller = new Scroller(getContext(), new OvershootInterpolator(OVERSHOOT_TENSION));
	}

	// 调用此方法滚动到目标位置
	public void smoothScrollTo(int fx, int fy) {
		int dx = fx - mScroller.getFinalX();
		int dy = fy - mScroller.getFinalY();
		smoothScrollBy(dx, dy);
	}

	// 调用此方法设置滚动的相对偏移
	public void smoothScrollBy(int dx, int dy) {

		// 设置mScroller的滚动偏移量
		mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);
		// 这里必须调用invalidate()才能保证computeScroll()会被调用，否则不一定会刷新界面，看不到滚动效果
		invalidate();
	}

	@Override
	public void computeScroll() {

		// 先判断mScroller滚动是否完成
		if (mScroller.computeScrollOffset()) {

			// 这里调用View的scrollTo()完成实际的滚动
			scrollTo(mScroller.getCurrX(), mScroller.getCurrY());

			// 必须调用该方法，否则不一定能看到滚动效果
			postInvalidate();
		}
		super.computeScroll();
	}

	public final void smoothScrollToNormal() {
		smoothScrollTo(0, 0);
	}

	public final int getScrollerCurrY() {
		return mScroller.getCurrY();
	}
}